home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 014 / ippon014.lzh / effect.c next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  97 lines

  1. /* effect.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5. #include "main.h"
  6. #include "effect.h"
  7.  
  8.  
  9. #define EFFECT_MAX    32    /* エフェクト最大数 */
  10. static EFFECT effect[EFFECT_MAX];    /* ワーク */
  11. static EFFECT *effect_top,    /* 使用中のワークのリスト */
  12.  *effect_null_top;        /* 空のワークのリスト */
  13.  
  14.  
  15. /* ザコキャラ爆発 */
  16. static short EffectMoveExplZako (EFFECT * p)
  17. {
  18.     if (p->pt++ >= obj_explall + 71 + 29 - 1)
  19.         return (-1);
  20.     else
  21.         xobj_set_st (p);
  22.  
  23.     return (0);
  24. }
  25.  
  26.  
  27.  
  28. /* ゲーム開始時に呼ばれる */
  29. void EffectInit (void)
  30. {
  31.     int i;
  32.  
  33.     /* リストをつなげる */
  34.     effect_top = NULL;
  35.     effect_null_top = effect;
  36.     for (i = 0; i < EFFECT_MAX; i++)
  37.         effect[i].next = &effect[i + 1];
  38.  
  39.     effect[EFFECT_MAX - 1].next = NULL;
  40. }
  41.  
  42.  
  43.  
  44. /* エフェクト出現時に呼ばれる */
  45. void EffectAlloc (short type, short type2, short x, short y)
  46. {
  47.     EFFECT *p;
  48.  
  49.     if (effect_null_top == NULL)
  50.         return;        /* 空きのワークがない(キャラクターオーバー) */
  51.  
  52.     p = effect_null_top;
  53.     effect_null_top = p->next;
  54.     p->next = effect_top;
  55.     effect_top = p;
  56.  
  57.     p->type = type;
  58.     p->type2 = type2;
  59.     p->x = x;
  60.     p->y = y;
  61.  
  62.     p->pt = obj_explall + 71;
  63.     p->info = 0x0100 | PRIORITY_ZAKO_EXPL;
  64.     p->func_effect_move = EffectMoveExplZako;
  65. }
  66.  
  67.  
  68.  
  69. /* 垂直同期ごとに呼ばれる */
  70. void EffectMove (void)
  71. {
  72.     EFFECT *p, *q;
  73.  
  74.     p = effect_top;        /* 現在注目しているワーク */
  75.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  76.     while (p != NULL) {
  77.         /* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  78.         if ((p->func_effect_move) (p)) {    /* 返り値が非0なら消去 */
  79.             if (q == NULL) {    /* リストの一番最初を削除 */
  80.                 effect_top = p->next;
  81.                 p->next = effect_null_top;
  82.                 effect_null_top = p;
  83.                 q = NULL;
  84.                 p = effect_top;
  85.             } else {
  86.                 q->next = p->next;
  87.                 p->next = effect_null_top;
  88.                 effect_null_top = p;
  89.                 p = q->next;
  90.             }
  91.         } else {
  92.             q = p;
  93.             p = p->next;
  94.         }
  95.     }
  96. }
  97.